REM >DynamcArea

menu$="DynamicAreas"
OSCLI"Set Director$Menu "+menu$

ON ERROR: ON ERROR OFF: ERROR ERR,REPORT$+" at "+STR$ ERL

Menu=FNswi_number("Director_Menu")
EndMenu=FNswi_number("Director_EndMenu")
Option=FNswi_number("Director_Option")
Command=FNswi_number("Director_Command")
Dash=FNswi_number("Director_Dash")
OS_DynamicArea=FNswi_number("OS_DynamicArea")
OS_ReadDynamicArea=FNswi_number("OS_ReadDynamicArea")

DIM buffer% 256

SYS Menu,"<Director$Menu> -temp"

max_base%=0
items%=0
IF OS_DynamicArea<0 THEN
  PROCaddarea_old
ELSE
  PROCaddarea(FALSE)
  SYS Dash
  PROCaddarea(TRUE)
ENDIF

SYS Option,"""Max base is &"+RIGHT$("0000000"+STR$~max_base%,8)+""" -grey"

SYS EndMenu

REM OSCLI"DirectorDo DirectorShowMenu <Director$Menu>"

END

DEF PROCaddarea(system%)
  start%=items%
  area% = -1
  REPEAT
    SYS OS_DynamicArea,3,area% TO ,area%
    IF area%<>-1 AND (system% EOR (area%>=256)) THEN
      SYS OS_DynamicArea,2,area% TO , , size%, base%, flags%, max_size%, , , name$
      PROCoption(name$, area%, size%, base%, max_size%)
      items%+=1
    ENDIF
  UNTIL area% = -1
  SYS "Director_SortMenu",menu$,start%,items%-1
ENDPROC

DEF PROCaddarea_old
  start%=items%
  PROCadd_an_area(0, "System heap")
  PROCadd_an_area(1, "Module area")
  PROCadd_an_area(2, "Screen memory")
  PROCadd_an_area(3, "System sprites")
  PROCadd_an_area(4, "Font cache")
  PROCadd_an_area(5, "RAM disc")
  SYS "Director_SortMenu",menu$,start%,items%-1
ENDPROC

DEF PROCadd_an_area(area%, name$)
  SYS OS_ReadDynamicArea,area% OR 128 TO base%, size%, max_size%
  PROCoption(name$, area%, size%, base%, max_size%)
ENDPROC

DEF PROCoption(name$, area%, size%, base%, max_size%)
  sub$="-sub ""Dynamic:/Director:Menus.System.DynAreaSub "+STR$ area%+" """""+name$+""""" "+FNfilename(name$)+" "+STR$~base%+" "+STR$~size%+""""
  SYS Option,""""+name$+" ("+FNk(size%)+" max:"+FNk(max_size%)+")"" "+sub$
  items%+=1
  IF base% < 0 OR base% > max_base% THEN max_base%=base%
ENDPROC

DEF FNswi_number(name$)
  LOCAL f%
  SYS "XOS_SWINumberFromString",,name$ TO A%;f%
  IF (f% AND 1) THEN A%=-1
=A%

DEF FNfilename(a$)
LOCAL b$
  b$=""
  FOR i%=1 TO LEN(a$)
    c$=MID$(a$,i%,1)
    IF INSTR("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",c$) THEN b$+=c$
  NEXT i%
=LEFT$(b$,10)

DEF FNk(n%)
IF n% < 1024 THEN
  = STR$(n%)
ELSE IF n% < 1024*1024 THEN
  = STR$(INT(n%/1024*10+0.5)/10)+"k"
ELSE
  = STR$(INT(n%/1024/1024*10+0.5)/10)+"M"
ENDIF


